package com.atguigu.cloud.order.feign;

import feign.RetryableException;
import feign.Retryer;

/**
 * 自定义重试器
 *
 * @author Taeyang
 * @date 2025/4/5
 */
public class FeignClientRetryer implements Retryer {

    /**
     * 定义两个成员变量来决定重试次数
     */
    private int start = 1;
    private final int end = 3;

    /**
     * 是否需要进行重试取决于该方法是否抛出异常，如果抛出异常重试结束
     *
     * @param e 异常
     */
    @Override
    public void continueOrPropagate(RetryableException e) {

        // 每一次发起重试之前都会对这个方法进行判断：判断是否进行重试
        if (start >= end) {
            throw new RuntimeException(e);
        }
        start++;
    }

    /**
     * 框架底层调用该方法得到一个重试器（个人感觉像是自定义重试器工厂）
     *
     * @return 自定义重试器
     */
    @Override
    public Retryer clone() {
        return new FeignClientRetryer();
    }
}
